-- 移动模块
local ConfigLoader = require("config.loader")
local Settings = require("config.settings")
local config = ConfigLoader.load(Settings.CURRENT_GAME)
local logger = require "utils.logger"
local stateManager = require "utils.state_manager"
local tslib = require("TSLib")
local combat = require("modules.combat")

local Movement = {}

-- 配置参数（需用户根据实际情况修改）

-- 处理移动
function Movement.handleMovement()
    logger.info("处理移动")

    -- 检查是否在地图状态
    if not stateManager.isInState(stateManager.States.IN_MAP) then
        logger.warn("不在地图状态，无法处理移动")
        return
    end

    -- 根据当前状态决定移动方式
    -- 这里可以添加更多的移动策略
    Movement.moveInCircle()
end

-- 移动到指定坐标
function Movement.moveTo(x, y)
    logger.info("移动到坐标", {x, y})
    tap(x, y)
    mSleep(5000)
end

-- 使用回城石
function Movement.useTownStone()
  logger.debug("开始检测回城石")    
    local ok, x, y = pcall(function()
        return findMultiColorInRegionFuzzy(
            config.MOVEMENT.back_stone_colors.main_color,
            config.MOVEMENT.back_stone_colors.offsets,
            90,
            config.MOVEMENT.back_stone_area.x1,
            config.MOVEMENT.back_stone_area.y1,
            config.MOVEMENT.back_stone_area.x2,
            config.MOVEMENT.back_stone_area.y2,
            { orient = 2 }
        )
    end)
    
    if x ~= -1 then
        combat.stopAutoAttack()
        logger.info(string.format("发现回城石 坐标:(%d,%d)", x, y))
        tap(x, y)
        mSleep(1800)
        return true
    else
        logger.error("未发现回城石")
        return false
    end
end

-- 使用随机石
function Movement.useRandomStone()
    logger.debug("开始检测随机石")
    
    local ok, x, y = pcall(function()
        return findMultiColorInRegionFuzzy(
            config.MOVEMENT.random_stone_colors.main_color,
            config.MOVEMENT.random_stone_colors.offsets,
            90,
            config.MOVEMENT.back_stone_area.x1,
            config.MOVEMENT.back_stone_area.y1,
            config.MOVEMENT.back_stone_area.x2,
            config.MOVEMENT.back_stone_area.y2,
            { orient = 2 }
        )
    end)
    
    if x ~= -1 then
        logger.info(string.format("发现随机石 坐标:(%d,%d)", x, y))
        tap(x, y)
        return true
    else
        logger.error("未发现随机石")
        return false
    end
end

-- 是否在盟重，通过多点比色
function Movement.isInMZ()
    return Movement.isInSafeZone(1)
end

-- 是否在安全一，通过多点比色。随机点击屏幕上的地图名称
function Movement.isInSafeZone(zone_id)
    if zone_id and config.MOVEMENT.SAFE_ZONE_COLORS[zone_id] then
        return multiColor(config.MOVEMENT.SAFE_ZONE_COLORS[zone_id])
    end
    logger.error("无效的安全区ID:"..tostring(zone_id))
    return false
end
-- 是否在承包地图，通过多点比色
function Movement.isContractMap()
    return multiColor(config.MOVEMENT.MAP_DETECTION_COLORS.CONTRACT_MAP)
end

-- 是否在恶魔虫谷，通过多点比色
function Movement.isInDevilWormValley()
    return multiColor(config.MOVEMENT.MAP_DETECTION_COLORS.DEVIL_WORM_VALLEY)
end

--是否在镇妖塔,通过多点比色
function Movement.isInTower()
    return multiColor(config.MOVEMENT.MAP_DETECTION_COLORS.TOWER)
end

--是否打开镇妖塔交互界面
function Movement.isOpenTowerUI()
    return multiColor(config.MOVEMENT.MAP_DETECTION_COLORS.TOWER_UI)
end

--是否到达100层
function Movement.isReach100Layer()
    return multiColor(config.MOVEMENT.MAP_DETECTION_COLORS.REACH_100_LAYER)
end

-- 点击指定坐标
function Movement.click(x, y, delay)
    tap(x, y)
    mSleep(delay or 1000)
end

-- 八方向拖动函数
function Movement.dragDirection(direction, holdTime)
    local buttonX, buttonY = 279, 608
    logger.info("开始方向拖动", {buttonX = buttonX, buttonY = buttonY, direction = direction, holdTime = holdTime})
    
    -- 预设八个方向偏移量（50像素）
    local directions = {
        east      = {x =  50, y =   0},
        west      = {x = -50, y =   0},
        south     = {x =   0, y =  50},
        north     = {x =   0, y = -50},
        northeast = {x =  35, y = -35},
        northwest = {x = -35, y = -35},
        southeast = {x =  35, y =  35},
        southwest = {x = -35, y =  35}
    }
    
    -- 验证方向参数
    if not directions[direction:lower()] then
        logger.error("无效方向参数:", direction)
        return false
    end
    
    -- 执行触摸操作
    touchDown(buttonX, buttonY)
    mSleep(50)  -- 初始按压等待
    
    -- 向目标方向移动
    local offset = directions[direction:lower()]
    touchMove(buttonX + offset.x, buttonY + offset.y)
    
    -- 保持按压状态指定时间（毫秒）
    mSleep(holdTime)
    
    -- 结束操作
    touchUp(buttonX + offset.x, buttonY + offset.y)

    mSleep(1000)
    return true
end

-- 随机拖动方向
function Movement.useRandomDragDirection(holdTime)
    local directions = {'east', 'west', 'south', 'north', 'northeast', 'northwest', 'southeast', 'southwest'}
    local randomDirection = directions[math.random(#directions)]
    return Movement.dragDirection(randomDirection, holdTime)
end

-- 等待指定时间（毫秒）
function Movement.clickSeries(buttons)
    
    if type(buttons) ~= "table" then
        logger.error("按钮参数类型错误，需要table类型")
        return false
    end

    for i, btn in ipairs(buttons) do
        if #btn >= 3 then
            logger.info(string.format("点击第%d个按钮 (x:%d,y:%d)", i, btn[1], btn[2]))
            tap(btn[1], btn[2])
            mSleep(btn[4] or 800)  -- 默认1.5秒间隔
        else
            logger.warn(string.format("第%d个按钮参数不完整，已跳过", i))
        end
    end
    
    return true
end

function Movement.wait(ms)
    mSleep(ms)
end

return Movement
